Validation এবং Error Handling Techniques

Microsoft Technologies - এমভিভিএম (MVVM)
200
200

MVVM প্যাটার্নে Validation এবং Error Handling অ্যাপ্লিকেশনের ডেটার সঠিকতা নিশ্চিত করতে এবং ব্যবহারকারীর জন্য একটি মসৃণ, নির্ভরযোগ্য অভিজ্ঞতা প্রদান করতে অত্যন্ত গুরুত্বপূর্ণ। Validation এবং Error Handling একে অপরের পরিপূরক, যেখানে Validation ডেটার বৈধতা যাচাই করে এবং Error Handling সিস্টেমের মধ্যে সম্ভাব্য ত্রুটি বা এক্সেপশন পরিচালনা করে।


Validation Techniques

Validation একটি প্রক্রিয়া যার মাধ্যমে ইনপুট ডেটার সঠিকতা এবং অখণ্ডতা নিশ্চিত করা হয়। এটি ডেটার Model স্তরে হতে পারে এবং ViewModelCommand বা UI থেকে ইনপুট সংগ্রহের সময় করা হয়।

Validation Techniques:

  1. Data Annotations:

    • Data Annotations হল এমন একটি প্রক্রিয়া যেখানে Model এর প্রপার্টি গুলোর উপরে বৈধতা যাচাইয়ের জন্য কিছু অ্যাট্রিবিউট যুক্ত করা হয়। এই অ্যাট্রিবিউটগুলির মাধ্যমে ডেটা ইনপুটের সঠিকতা পরীক্ষা করা হয়।
    • এটি সাধারণত Required, StringLength, Range ইত্যাদি অ্যাট্রিবিউট ব্যবহার করে ইনপুট ভ্যালিডেশন প্রয়োগ করা হয়।

    উদাহরণ:

    public class Product
    {
        [Required(ErrorMessage = "Product name is required")]
        [StringLength(100, ErrorMessage = "Name cannot exceed 100 characters")]
        public string Name { get; set; }
    
        [Range(0.1, 10000, ErrorMessage = "Price must be between 0.1 and 10,000")]
        public decimal Price { get; set; }
    }
    

    এখানে Product মডেলের প্রপার্টি গুলোর উপর Required এবং Range অ্যাট্রিবিউট ব্যবহার করা হয়েছে।

  2. INotifyDataErrorInfo:

    • INotifyDataErrorInfo ইন্টারফেসটি ViewModel-এ ভ্যালিডেশন ফলাফলগুলি ম্যানেজ করার জন্য ব্যবহৃত হয়। এটি ব্যবহারকারীর ইনপুটের জন্য ত্রুটি রিপোর্টিং প্রক্রিয়া সক্ষম করে।

    উদাহরণ:

    public class ProductViewModel : INotifyDataErrorInfo
    {
        private string _name;
        private readonly Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
    
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                ValidateName();
                OnPropertyChanged(nameof(Name));
            }
        }
    
        public bool HasErrors => _errors.Any();
    
        public IEnumerable GetErrors(string propertyName)
        {
            if (string.IsNullOrEmpty(propertyName))
                return _errors.Values.SelectMany(e => e);
            
            if (_errors.ContainsKey(propertyName))
                return _errors[propertyName];
            
            return null;
        }
    
        private void ValidateName()
        {
            if (string.IsNullOrEmpty(_name))
            {
                _errors[nameof(Name)] = new List<string> { "Name is required" };
            }
            else
            {
                _errors.Remove(nameof(Name));
            }
        }
    
        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
    }
    

    এই উদাহরণে, INotifyDataErrorInfo ইন্টারফেস ব্যবহার করে ProductViewModel-এ নামের জন্য একটি ভ্যালিডেশন লজিক তৈরি করা হয়েছে।

  3. Custom Validation Logic:

    • Custom Validation Logic ব্যবহারকারী নির্দিষ্ট কোনো শর্তের ভিত্তিতে ডেটা যাচাই করতে পারে, যা Data Annotations দ্বারা কভার করা সম্ভব নয়।
    • ViewModel বা Model স্তরে কাস্টম ভ্যালিডেশন মেথড তৈরি করে এই প্রক্রিয়া প্রয়োগ করা যেতে পারে।

    উদাহরণ:

    public bool ValidateProduct(Product product)
    {
        if (product.Price <= 0)
        {
            // Custom validation error
            return false;
        }
        return true;
    }
    

Error Handling Techniques

Error Handling এমন একটি প্রক্রিয়া যা অ্যাপ্লিকেশনে ভুল বা এক্সেপশন ঘটলে সেগুলিকে পরিচালনা করতে সহায়ক হয়, যাতে ব্যবহারকারী বুঝতে পারে কি সমস্যা হয়েছে এবং অ্যাপ্লিকেশনটি সঠিকভাবে কাজ করতে পারে।

Error Handling Techniques:

  1. Try-Catch Blocks:

    • Try-Catch ব্লক ব্যবহার করে অ্যাপ্লিকেশনের মধ্যে সম্ভাব্য ত্রুটি বা এক্সেপশন ধরার মাধ্যমে তা নিরোধ করা যায়। এটি ViewModel বা Service লেভেলে এক্সেপশন হ্যান্ডলিং করতে ব্যবহার করা হয়।

    উদাহরণ:

    public void UpdatePrice(decimal newPrice)
    {
        try
        {
            _product.Price = newPrice;
            // Save to database or perform additional operations
        }
        catch (Exception ex)
        {
            // Handle the error (log, show message, etc.)
            LogError(ex);
        }
    }
    

    এখানে Try-Catch ব্লক ব্যবহার করে, প্রাইস আপডেট করার সময় কোনো ত্রুটি ঘটলে তা হ্যান্ডেল করা হয়েছে।

  2. Global Error Handling:

    • অ্যাপ্লিকেশন সাপোর্ট করার জন্য Global Error Handling এর মাধ্যমে সব ধরণের এক্সেপশন কেন্দ্রীয়ভাবে হ্যান্ডল করা যায়। এটি সাধারণত অ্যাপ্লিকেশনের মূল পর্যায়ে কনফিগার করা হয়, যেমন App.xaml.cs (WPF অ্যাপ্লিকেশনে) বা Global.asax (ASP.NET অ্যাপ্লিকেশনে)।

    WPF Example:

    Application.Current.DispatcherUnhandledException += (sender, e) =>
    {
        MessageBox.Show($"An error occurred: {e.Exception.Message}");
        e.Handled = true;  // Mark the exception as handled
    };
    

    এই কোডে, যেকোনো আনহ্যান্ডেলড এক্সেপশনকে DispatcherUnhandledException ইভেন্টের মাধ্যমে হ্যান্ডল করা হয়েছে।

  3. Error Logging:

    • Error Logging হল এক্সেপশন বা ত্রুটির ডিটেইল লগ করার একটি প্রক্রিয়া যাতে ভবিষ্যতে ত্রুটির কারণ এবং সঠিক সমাধান সহজে খুঁজে পাওয়া যায়। সাধারণত, Log4Net, Serilog, অথবা NLog এর মতো লাইব্রেরি ব্যবহার করে লগিং করা হয়।

    উদাহরণ:

    public void LogError(Exception ex)
    {
        var logger = LogManager.GetLogger("ErrorLogger");
        logger.Error(ex, "An error occurred while updating the price.");
    }
    

    এখানে LogManager ব্যবহার করে ত্রুটি লগ করা হয়েছে যাতে ভবিষ্যতে ডিবাগিং বা সমস্যা সমাধান সহজ হয়।

  4. User-Friendly Error Messages:

    • ব্যবহারকারীর জন্য এক্সেপশন বা ত্রুটির বার্তা সহজ ও স্পষ্টভাবে প্রদর্শন করা গুরুত্বপূর্ণ। এটি বিশেষ করে View-এ সঠিক ত্রুটি বার্তা দেখানোর মাধ্যমে করা হয় যাতে ব্যবহারকারী বুঝতে পারে কী ভুল হয়েছে এবং কীভাবে এটি ঠিক করা যাবে।

    উদাহরণ:

    public void DisplayError(string message)
    {
        // Display error message to the user
        MessageBox.Show(message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }
    

    এখানে MessageBox ব্যবহার করে ব্যবহারকারীকে ত্রুটি বার্তা প্রদর্শন করা হয়েছে।


সারাংশ

Validation এবং Error Handling অ্যাপ্লিকেশনটির নির্ভরযোগ্যতা এবং ব্যবহারকারী অভিজ্ঞতা নিশ্চিত করতে অত্যন্ত গুরুত্বপূর্ণ। Validation নিশ্চিত করে যে ডেটা সঠিক এবং উপযুক্ত, যখন Error Handling ত্রুটির কারণ নির্ধারণ এবং তা সমাধান করার জন্য প্রক্রিয়া প্রদান করে। এই দুটি প্রক্রিয়া সম্মিলিতভাবে ব্যবহারকারীর জন্য একটি মসৃণ, ত্রুটি মুক্ত অভিজ্ঞতা নিশ্চিত করতে সাহায্য করে।

common.content_added_by

IDataErrorInfo এবং INotifyDataErrorInfo Interface ব্যবহার

163
163

IDataErrorInfo এবং INotifyDataErrorInfo দুটি ইন্টারফেস MVVM প্যাটার্নে ডেটা ভ্যালিডেশন (Data Validation) করার জন্য ব্যবহৃত হয়। যখন একটি অ্যাপ্লিকেশন ইউজার ইনপুট নেয়, তখন ডেটা সঠিক কিনা তা যাচাই করা অত্যন্ত গুরুত্বপূর্ণ। এই দুইটি ইন্টারফেস আপনাকে আপনার অ্যাপ্লিকেশন ডেটার ভ্যালিডেশন ম্যানেজ করতে সাহায্য করে, এবং MVVM প্যাটার্নে ViewModel-এ এই ভ্যালিডেশনকে ইনক্লুড করা হয়।


IDataErrorInfo Interface

IDataErrorInfo ইন্টারফেসটি একটি সিঙ্গল প্রপার্টি এবং একটি মেথড প্রদান করে, যা UI কে জানাতে সাহায্য করে যে কোনো প্রপার্টি বৈধ কিনা। যখন কোনো ViewModel এর প্রপার্টি ত্রুটি ঘটায়, তখন IDataErrorInfo এর মাধ্যমে একটি ত্রুটি বার্তা প্রদর্শন করা হয়। এটি সাধারণত সিঙ্গেল প্রপার্টির ভিত্তিতে ত্রুটি যাচাইয়ের জন্য ব্যবহৃত হয়।

IDataErrorInfo Interface এর বৈশিষ্ট্য

  1. Error Property: সাধারণ ত্রুটির বার্তা প্রদান করে।
  2. Item Property: নির্দিষ্ট প্রপার্টির জন্য ত্রুটি বার্তা প্রদান করে।

IDataErrorInfo এর উদাহরণ:

public class Product : IDataErrorInfo
{
    private string _name;
    private decimal _price;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }

    public string Error
    {
        get { return "There are some errors in the product."; }
    }

    public string this[string columnName]
    {
        get
        {
            string errorMessage = null;

            // Checking for validation on 'Name'
            if (columnName == "Name" && string.IsNullOrEmpty(_name))
            {
                errorMessage = "Name cannot be empty.";
            }

            // Checking for validation on 'Price'
            if (columnName == "Price" && _price <= 0)
            {
                errorMessage = "Price must be greater than zero.";
            }

            return errorMessage;
        }
    }
}

এখানে:

  • Error প্রপার্টি সাধারণ ত্রুটি বার্তা প্রদান করে, যা সমস্ত প্রপার্টির জন্য প্রযোজ্য হতে পারে।
  • Item প্রপার্টি (this[string columnName]) নির্দিষ্ট প্রপার্টি অনুযায়ী ত্রুটি বার্তা প্রদান করে।

IDataErrorInfo এর মাধ্যমে ViewModel এর প্রপার্টি ভ্যালিডেশনের ত্রুটি পরিচালনা করা যায়, এবং View তে ওই ত্রুটির বার্তা প্রদর্শন করা হয়।


INotifyDataErrorInfo Interface

INotifyDataErrorInfo ইন্টারফেসটি IDataErrorInfo এর মতোই কাজ করে, তবে এতে কিছু উন্নত ফিচার রয়েছে। INotifyDataErrorInfo একটি ইভেন্টের মাধ্যমে ডেটা ত্রুটি পরিবর্তন সিগন্যাল পাঠাতে সাহায্য করে, যাতে UI তে ত্রুটি বার্তা সহজে আপডেট করা যায়। এটি বিশেষভাবে যখন ভ্যালিডেশন পরিবর্তিত হয়, তখন UI কে জানাতে সহায়ক হয়, যেমন একটি ফর্মে কোনো ত্রুটি ঘটলে তা সঠিকভাবে প্রতিফলিত হয়।

INotifyDataErrorInfo Interface এর বৈশিষ্ট্য

  1. HasErrors Property: জানায় যে, ডেটাতে কোনো ত্রুটি রয়েছে কিনা।
  2. ErrorsChanged Event: ত্রুটি পরিবর্তিত হলে ইভেন্ট ট্রিগার করে।
  3. GetErrors Method: নির্দিষ্ট প্রপার্টি বা সমস্ত প্রপার্টি সম্পর্কিত ত্রুটি রিটার্ন করে।

INotifyDataErrorInfo এর উদাহরণ:

public class Product : INotifyDataErrorInfo
{
    private string _name;
    private decimal _price;
    private Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            ValidateName();
        }
    }

    public decimal Price
    {
        get { return _price; }
        set
        {
            _price = value;
            ValidatePrice();
        }
    }

    public bool HasErrors => _errors.Any();

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public IEnumerable GetErrors(string propertyName)
    {
        if (_errors.ContainsKey(propertyName))
        {
            return _errors[propertyName];
        }

        return null;
    }

    private void ValidateName()
    {
        if (string.IsNullOrEmpty(_name))
        {
            AddError("Name", "Name cannot be empty.");
        }
        else
        {
            RemoveError("Name");
        }
    }

    private void ValidatePrice()
    {
        if (_price <= 0)
        {
            AddError("Price", "Price must be greater than zero.");
        }
        else
        {
            RemoveError("Price");
        }
    }

    private void AddError(string propertyName, string error)
    {
        if (!_errors.ContainsKey(propertyName))
        {
            _errors[propertyName] = new List<string>();
        }

        if (!_errors[propertyName].Contains(error))
        {
            _errors[propertyName].Add(error);
            OnErrorsChanged(propertyName);
        }
    }

    private void RemoveError(string propertyName)
    {
        if (_errors.ContainsKey(propertyName))
        {
            _errors[propertyName].Clear();
            OnErrorsChanged(propertyName);
        }
    }

    private void OnErrorsChanged(string propertyName)
    {
        ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
    }
}

এখানে:

  • HasErrors প্রপার্টি সমস্ত ত্রুটি যাচাই করে, যা true বা false রিটার্ন করবে।
  • ErrorsChanged ইভেন্ট ত্রুটির পরিবর্তন ঘটলে ট্রিগার হয়, এবং View তে UI আপডেট করতে সহায়ক হয়।
  • GetErrors মেথড নির্দিষ্ট প্রপার্টি বা সমস্ত প্রপার্টির জন্য ত্রুটি রিটার্ন করে।

IDataErrorInfo এবং INotifyDataErrorInfo এর মধ্যে পার্থক্য

  1. ডেটা আপডেট:
    • IDataErrorInfo ত্রুটি ম্যানেজমেন্টে সিঙ্গেল থ্রেডেড এবং আপডেট করা একেবারে সরাসরি হয়।
    • INotifyDataErrorInfo ত্রুটি পরিবর্তিত হলে UI তে তৎক্ষণাৎ আপডেট করার জন্য ErrorsChanged ইভেন্ট ব্যবহার করে, যা UI-তে রিয়েল টাইম ত্রুটি ম্যানেজমেন্ট করতে সহায়ক।
  2. ইভেন্ট হ্যান্ডলিং:
    • IDataErrorInfo ত্রুটির বার্তা সরাসরি মেথডের মাধ্যমে প্রদর্শিত হয়, তবে ত্রুটি পরিবর্তন হলে UI তে তা স্বয়ংক্রিয়ভাবে আপডেট হয় না।
    • INotifyDataErrorInfo ইভেন্ট ব্যবহার করে ত্রুটি পরিবর্তন ট্র্যাক করে এবং UI কে জানানোর জন্য ErrorsChanged ইভেন্ট ব্যবহার করে।
  3. লচিলাতা:
    • IDataErrorInfo তুলনায় INotifyDataErrorInfo বেশি লচিল (flexible) এবং ডাইনামিকভাবে UI তে ত্রুটি প্রদর্শন করতে সাহায্য করে।

উপসংহার

IDataErrorInfo এবং INotifyDataErrorInfo দুটি ইন্টারফেস ডেটা ভ্যালিডেশন পরিচালনা করতে ব্যবহৃত হয়। IDataErrorInfo সরল এবং সোজা ইন্টারফেস, যা মূলত প্রপার্টির জন্য ভ্যালিডেশন বার্তা সরবরাহ করে। অন্যদিকে, INotifyDataErrorInfo উন্নত এবং ডাইনামিক ভ্যালিডেশন ম্যানেজমেন্ট সরবরাহ করে, যা UI তে ত্রুটি আপডেট করার জন্য ইভেন্ট ব্যবহার করে। MVVM প্যাটার্নে এই ইন্টারফেসগুলো ViewModel এর মধ্যে ডেটা ভ্যালিডেশন নিশ্চিত করতে ব্যবহৃত হয়, যাতে ব্যবহারকারীর ইনপুট ত্রুটি শোধরানো যায়।

common.content_added_by

Validation Rules এবং Custom Validation Logic

209
209

MVVM (Model-View-ViewModel) প্যাটার্নে Validation হল এমন একটি প্রক্রিয়া যেখানে ব্যবহারকারীর ইনপুট ডেটা যাচাই করা হয়, যাতে অ্যাপ্লিকেশনটি সঠিক ডেটা প্রক্রিয়া করতে পারে। Validation Rules সাধারণত ViewModel বা Model-এ নির্ধারিত হয় এবং ইউজারের ইনপুট ডেটা সঠিক কিনা তা যাচাই করার জন্য ব্যবহৃত হয়। Custom Validation Logic ব্যবহারকারীর নির্দিষ্ট চাহিদা অনুসারে প্রক্রিয়া তৈরি করার জন্য ব্যবহৃত হয়, যেমন একটি নির্দিষ্ট ক্ষেত্রের জন্য কাস্টম নিয়ম তৈরি করা।


Validation Rules

Validation Rules হল এমন নিয়ম যা ইনপুট ডেটা যাচাই করে দেখে, এটি সঠিক কিনা। MVVM প্যাটার্নে, এই validation সাধারণত ViewModel-এ পরিচালিত হয় এবং Binding এর মাধ্যমে View তে প্রয়োগ করা হয়। একাধিক প্রকারের ভ্যালিডেশন রুলস ব্যবহৃত হতে পারে, যেমন:

  • Required Validation: ইনপুট ফিল্ডটি খালি থাকতে পারবে না।
  • Range Validation: একটি সংখ্যা একটি নির্দিষ্ট পরিসরের মধ্যে থাকতে হবে।
  • Regular Expression Validation: একটি স্ট্রিং নির্দিষ্ট প্যাটার্নের সাথে মিলতে হবে, যেমন ইমেইল বা ফোন নম্বর।

Validation Rules এর উদাহরণ

ধরা যাক, একটি ফর্মে ইউজার নাম এবং ইমেইল ইনপুট ফিল্ড রয়েছে এবং আমরা চাই যে:

  1. ইউজার নাম খালি না থাকে।
  2. ইমেইল ফিল্ডটি একটি বৈধ ইমেইল ফরম্যাটে থাকতে হবে।
1. Required Validation (RequiredFieldValidator)
public class UserViewModel : INotifyPropertyChanged
{
    private string _username;

    public string Username
    {
        get { return _username; }
        set { _username = value; OnPropertyChanged(); }
    }

    public bool IsUsernameValid()
    {
        return !string.IsNullOrEmpty(Username);
    }
}
2. Email Validation (Regular Expression)
public class UserViewModel : INotifyPropertyChanged
{
    private string _email;

    public string Email
    {
        get { return _email; }
        set { _email = value; OnPropertyChanged(); }
    }

    public bool IsEmailValid()
    {
        var emailPattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
        return Regex.IsMatch(Email, emailPattern);
    }
}

এখানে, IsUsernameValid() এবং IsEmailValid() মেথডগুলি ব্যবহারকারীর ইনপুট যাচাই করবে।


Custom Validation Logic

Custom Validation Logic ব্যবহারকারীর চাহিদা অনুযায়ী তৈরি করা যেতে পারে, যা ডেটা যাচাই করার জন্য কাস্টম নিয়ম বা শর্ত নির্ধারণ করে। এটি সাধারণত complex validation প্রয়োজন যেখানে একাধিক শর্ত একসাথে প্রয়োগ করতে হয়।

Custom Validation Logic উদাহরণ

ধরা যাক, একটি পাসওয়ার্ড ফিল্ড রয়েছে এবং আমরা চাই যে পাসওয়ার্ডটি অন্তত ৮টি অক্ষর, একটি বড় হাতের অক্ষর, একটি ছোট হাতের অক্ষর এবং একটি সংখ্যা থাকতে হবে।

1. Custom Password Validation
public class UserViewModel : INotifyPropertyChanged
{
    private string _password;

    public string Password
    {
        get { return _password; }
        set { _password = value; OnPropertyChanged(); }
    }

    public bool IsPasswordValid()
    {
        if (string.IsNullOrEmpty(Password))
        {
            return false;
        }

        bool hasUpper = Password.Any(char.IsUpper);
        bool hasLower = Password.Any(char.IsLower);
        bool hasDigit = Password.Any(char.IsDigit);
        bool hasMinimumLength = Password.Length >= 8;

        return hasUpper && hasLower && hasDigit && hasMinimumLength;
    }
}

এখানে, IsPasswordValid() মেথডটি পাসওয়ার্ডে বিভিন্ন শর্ত যাচাই করে, যেমন বড় হাতের অক্ষর, ছোট হাতের অক্ষর, সংখ্যা এবং ন্যূনতম দৈর্ঘ্য।


Validation in MVVM with Data Binding

MVVM প্যাটার্নে Data Binding এবং Validation একে অপরের সাথে কাজ করতে পারে। যখন View-এর Binding ভ্যালিডেশন মেথডের সাথে সংযুক্ত থাকে, তখন ব্যবহারকারীর ইনপুট যাচাই করা হয় এবং যদি তা ভুল হয় তবে ব্যবহারকারীকে সঠিকভাবে ইনপুট করার জন্য সতর্ক করা হয়।

Validation with Data Binding in XAML

<TextBox Text="{Binding Username, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding UsernameError}" Foreground="Red"/>

এখানে, TextBox এর Text প্রোপার্টি Username প্রোপার্টির সাথে বেঁধে দেওয়া হয়েছে এবং যদি কোন ত্রুটি ঘটে, তবে তা UsernameError এর মাধ্যমে প্রদর্শিত হবে।


INotifyDataErrorInfo ব্যবহার করে Validation

INotifyDataErrorInfo ইন্টারফেসটি একটি ইন্টারফেস যা ডেটা ভ্যালিডেশন সম্পর্কিত ত্রুটির পরিচালনা করতে ব্যবহৃত হয়। এটি MVVM প্যাটার্নে ভ্যালিডেশন করতে বিশেষভাবে উপকারী, কারণ এটি ViewModel এ ত্রুটি তথ্য সরবরাহ করে এবং View তে ত্রুটি বার্তা প্রদর্শন করতে সক্ষম করে।

INotifyDataErrorInfo ইন্টারফেসের উদাহরণ

public class UserViewModel : INotifyDataErrorInfo
{
    private string _username;
    private Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();

    public string Username
    {
        get { return _username; }
        set 
        { 
            _username = value;
            ValidateUsername();
            OnPropertyChanged(); 
        }
    }

    private void ValidateUsername()
    {
        if (string.IsNullOrEmpty(Username))
        {
            AddError("Username", "Username is required.");
        }
        else
        {
            RemoveError("Username");
        }
    }

    private void AddError(string propertyName, string error)
    {
        if (!_errors.ContainsKey(propertyName))
        {
            _errors[propertyName] = new List<string>();
        }
        _errors[propertyName].Add(error);
        OnPropertyChanged(nameof(HasErrors));
    }

    private void RemoveError(string propertyName)
    {
        if (_errors.ContainsKey(propertyName))
        {
            _errors[propertyName].Clear();
            OnPropertyChanged(nameof(HasErrors));
        }
    }

    public bool HasErrors => _errors.Any();

    public IEnumerable<string> GetErrors(string propertyName)
    {
        if (_errors.ContainsKey(propertyName))
        {
            return _errors[propertyName];
        }
        return null;
    }
}

এখানে, INotifyDataErrorInfo ইন্টারফেসের GetErrors() মেথড ব্যবহার করে Username প্রোপার্টির জন্য ত্রুটি বার্তা ফেরত দেওয়া হচ্ছে।


Conclusion

Validation এবং Custom Validation Logic MVVM প্যাটার্নে একটি অত্যন্ত গুরুত্বপূর্ণ অংশ। ব্যবহারকারী ইনপুট যাচাই করার জন্য Validation Rules এবং Custom Validation এর মাধ্যমে অ্যাপ্লিকেশনটিকে আরো নিরাপদ এবং ব্যবহারকারী-বান্ধব করা সম্ভব। INotifyDataErrorInfo ইন্টারফেস ব্যবহার করে সেন্ট্রালাইজড এবং ইউনিফাইড ত্রুটি পরিচালনা সহজ হয়, যা UI তে ত্রুটি বার্তা প্রদর্শন করতে সহায়ক।

common.content_added_by

Validation Summary এবং Error Templates তৈরি

217
217

Validation হল ডেটা ইনপুটের সঠিকতা পরীক্ষা করার একটি প্রক্রিয়া। MVVM প্যাটার্নে, ডেটা ভ্যালিডেশন সাধারণত ViewModel বা Model-এ করা হয় এবং তার ফলাফল View-এ প্রদর্শিত হয়। Validation Summary এবং Error Templates হল দুটি উপায় যার মাধ্যমে ব্যবহারকারীর কাছে সঠিকভাবে ভ্যালিডেশন বার্তা এবং ইনপুট ফিল্ডের ত্রুটি দেখানো হয়।

এখানে Validation Summary এবং Error Templates তৈরি এবং কিভাবে এগুলি MVVM প্যাটার্নে ব্যবহার করা হয়, তা নিয়ে বিস্তারিত আলোচনা করা হয়েছে।


Validation Summary

Validation Summary হলো একটি তালিকা বা সারাংশ, যা View-এ সমস্ত ত্রুটি বা ভ্যালিডেশন বার্তা প্রদর্শন করতে ব্যবহৃত হয়। এটি সাধারণত একটি TextBlock বা ListBox ব্যবহার করে তৈরি করা হয়, যেখানে সমস্ত ভ্যালিডেশন ত্রুটি একসাথে প্রদর্শিত হয়।

Validation Summary তৈরি করা

আপনি যখন Validation Summary তৈরি করতে চান, তখন Validation.Errors কালেকশন ব্যবহার করতে পারেন, যা Binding ত্রুটির তালিকা ধারণ করে। এটি View-এ প্রদর্শন করার জন্য সাধারণত ValidationSummary এর মতো একটি কাস্টম উপাদান ব্যবহার করা হয়।

XAML Example:

<Window x:Class="ValidationSummaryExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Validation Summary" Height="350" Width="525">
    <Grid>
        <!-- Validation Summary -->
        <StackPanel>
            <TextBlock Text="Validation Errors:" FontWeight="Bold" />
            <ListBox Name="ErrorList" Height="150" />
        </StackPanel>

        <!-- Form Fields with Validation -->
        <StackPanel VerticalAlignment="Top">
            <TextBox Name="NameTextBox" Width="200" Margin="10" 
                     Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
            <TextBox Name="EmailTextBox" Width="200" Margin="10" 
                     Text="{Binding Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
            <Button Content="Submit" Width="100" Height="30" Margin="10" />
        </StackPanel>
    </Grid>
</Window>

ViewModel Example:

public class MainViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    private string _name;
    private string _email;

    public string Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged(); }
    }

    public string Email
    {
        get { return _email; }
        set { _email = value; OnPropertyChanged(); }
    }

    public string Error => null;

    public string this[string propertyName]
    {
        get
        {
            if (propertyName == nameof(Name) && string.IsNullOrWhiteSpace(Name))
                return "Name cannot be empty.";
            if (propertyName == nameof(Email) && !Email.Contains("@"))
                return "Invalid email address.";
            return null;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

এখানে IDataErrorInfo ইন্টারফেস ব্যবহার করে ডেটা ভ্যালিডেশন পরিচালিত হচ্ছে এবং Name এবং Email এর জন্য Error বার্তা সেট করা হচ্ছে। Validation.Errors কালেকশন View-এ ভ্যালিডেশন ত্রুটি প্রদর্শন করবে।


Error Templates

Error Templates হল এমন একটি কাস্টম UI উপাদান যা ত্রুটির ক্ষেত্রে ইনপুট ফিল্ডের সজ্জা পরিবর্তন করে, যেমন টেক্সট বক্সের চারপাশে লাল বর্ডার বা ত্রুটি বার্তা দেখানো। Error Templates ব্যবহার করে আপনি নির্দিষ্ট ইনপুট ফিল্ডের ত্রুটি ফিডব্যাক ব্যবহারকারীকে স্পষ্টভাবে প্রদান করতে পারেন।

Error Template তৈরি করা

Error Template তৈরি করতে ControlTemplate বা Style ব্যবহার করা হয়। আপনি Validation.HasError প্রপার্টি ব্যবহার করে একটি ইনপুট ফিল্ডের ত্রুটি পরীক্ষা করতে পারেন এবং ত্রুটির ভিত্তিতে UI পরিবর্তন করতে পারেন।

XAML Example:

<Window x:Class="ErrorTemplateExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Error Template" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="ErrorStyle" TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.HasError)}" Value="True">
                    <Setter Property="BorderBrush" Value="Red" />
                    <Setter Property="BorderThickness" Value="2" />
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

    <Grid>
        <!-- Form Fields with Error Template -->
        <TextBox Width="200" Height="30" Margin="10" 
                 Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
                 Style="{StaticResource ErrorStyle}" />
        <Button Content="Submit" Width="100" Height="30" Margin="10" />
    </Grid>
</Window>

ViewModel Example:

public class MainViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged(); }
    }

    public string Error => null;

    public string this[string propertyName]
    {
        get
        {
            if (propertyName == nameof(Name) && string.IsNullOrWhiteSpace(Name))
                return "Name cannot be empty.";
            return null;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

এখানে TextBox-এর চারপাশে লাল বর্ডার এবং একটি টুলটিপ সঠিকভাবে ত্রুটি বার্তা দেখানোর জন্য ErrorTemplate তৈরি করা হয়েছে। Validation.HasError ব্যবহার করে ত্রুটি চেক করা হচ্ছে, এবং ToolTip এ ত্রুটি বার্তা দেখানো হচ্ছে।


সারাংশ

  • Validation Summary এবং Error Templates MVVM প্যাটার্নে ভ্যালিডেশন এবং ইউজার ইন্টারফেসে ত্রুটি প্রদর্শনের জন্য শক্তিশালী টুল।
  • Validation Summary ব্যবহারকারীকে সমস্ত ত্রুটি একত্রিতভাবে দেখানোর সুযোগ দেয়, যা দ্রুত ডিবাগ এবং ফিক্সিংকে সহায়তা করে।
  • Error Templates ইনপুট ফিল্ডের সাথে ত্রুটি বার্তা এবং স্টাইল যুক্ত করে, যাতে ব্যবহারকারীকে ত্রুটি পরিষ্কারভাবে বোঝানো যায়।
  • IDataErrorInfo ইন্টারফেস এবং Validation.HasError ব্যবহার করে ত্রুটির চেক এবং প্রদর্শন করা সহজ হয়।

এভাবে MVVM প্যাটার্নে Validation Summary এবং Error Templates ব্যবহার করে অ্যাপ্লিকেশনের ডেটা ইনপুটের সঠিকতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করা যায়।

common.content_added_by

Async Validation এবং Error Notification Techniques

209
209

MVVM প্যাটার্নে Async Validation এবং Error Notification ব্যবহৃত হয় যখন অ্যাপ্লিকেশনের ভিউমডেল সঠিকভাবে ডেটা যাচাই করার পাশাপাশি ব্যবহারকারীকে ভুল তথ্য প্রদর্শন করতে চায়। Async Validation মূলত দীর্ঘস্থায়ী প্রক্রিয়া যেমন ডেটাবেস যাচাই, API কল, বা সার্ভার সাইড ভ্যালিডেশন হ্যান্ডেল করতে ব্যবহৃত হয়। এক্ষেত্রে, Error Notification ব্যবহারকারীকে সঠিকভাবে ফিডব্যাক দেয় যাতে তারা সমস্যা দ্রুত জানতে পারে এবং সংশোধন করতে পারে।


Async Validation

Async Validation হল সেই প্রক্রিয়া যেখানে ডেটা যাচাইয়ের কাজ একটি অ্যাসিঙ্ক্রোনাস (Asynchronous) পদ্ধতিতে করা হয়, যাতে ইউজার ইন্টারফেস (UI) স্ন্যাগ বা ফ্রিজ না হয়ে, স্বচ্ছন্দে কাজ চালিয়ে যেতে পারে। এক্ষেত্রে ViewModel-এ ICommand বা Task ব্যবহার করে ভ্যালিডেশন পরিচালিত হয়।

উদাহরণ: Async Validation in MVVM

ধরা যাক, আমরা একটি Email ফিল্ড ভ্যালিডেট করতে চাই, যা একটি সার্ভার সাইড চেক (যেমন ইমেইল রেজিস্ট্রেশন চেক) সম্পাদন করবে।

  1. ViewModel-এ Async Validation:
public class RegistrationViewModel : INotifyPropertyChanged
{
    private string _email;
    private string _emailError;
    private bool _isEmailValid;
    
    public string Email
    {
        get => _email;
        set
        {
            if (_email != value)
            {
                _email = value;
                OnPropertyChanged();
                ValidateEmailAsync();
            }
        }
    }

    public string EmailError
    {
        get => _emailError;
        private set
        {
            if (_emailError != value)
            {
                _emailError = value;
                OnPropertyChanged();
            }
        }
    }

    public bool IsEmailValid
    {
        get => _isEmailValid;
        private set
        {
            if (_isEmailValid != value)
            {
                _isEmailValid = value;
                OnPropertyChanged();
            }
        }
    }

    private async Task ValidateEmailAsync()
    {
        EmailError = string.Empty;
        IsEmailValid = false;

        if (string.IsNullOrEmpty(Email))
        {
            EmailError = "Email cannot be empty.";
            return;
        }

        var isValid = await CheckEmailInDatabaseAsync(Email);

        if (isValid)
        {
            IsEmailValid = true;
        }
        else
        {
            EmailError = "Email is already registered.";
        }
    }

    private async Task<bool> CheckEmailInDatabaseAsync(string email)
    {
        // Fake async DB check (in real case, call API or database)
        await Task.Delay(2000); // Simulating async task
        return email != "existing@example.com"; // Fake check
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

এখানে, Email প্রপার্টি যখন পরিবর্তিত হবে, তখন ValidateEmailAsync কল করা হবে, যা ইমেইলটি সার্ভারের সাথে যাচাই করবে এবং ব্যবহারকারীর কাছে উপযুক্ত ভুল বার্তা (Error Message) দেখাবে।

  1. XAML ফাইল (View) তে:
<!-- XAML File (View) -->
<TextBox Text="{Binding Email}" />
<TextBlock Text="{Binding EmailError}" Foreground="Red" />
<Button Content="Register" Command="{Binding RegisterCommand}" IsEnabled="{Binding IsEmailValid}" />

এখানে, EmailError ত্রুটি বার্তাটি TextBlock এ দেখানো হচ্ছে, যা ValidateEmailAsync থেকে প্রাপ্ত হবে।


Error Notification Techniques

Error Notification টেকনিকটি ব্যবহৃত হয় যখন অ্যাপ্লিকেশনটিতে কোনো ত্রুটি ঘটলে তা ব্যবহারকারীকে দেখানোর প্রয়োজন হয়। এই ত্রুটির বার্তা সাধারণত ViewModel থেকে View-এ পাঠানো হয়। এ জন্য আপনি INotifyDataErrorInfo বা ValidationAttribute ব্যবহার করতে পারেন।

1. INotifyDataErrorInfo Interface

INotifyDataErrorInfo ইন্টারফেসের মাধ্যমে ViewModel-এ ডেটা ভ্যালিডেশন এবং এরর ম্যাসেজ গুলি View-এ সরবরাহ করা যায়। এই ইন্টারফেসের মাধ্যমে অ্যাসিঙ্ক্রোনাস বা সিনক্রোনাস ভ্যালিডেশন করতে পারবেন।

উদাহরণ:
public class RegistrationViewModel : INotifyDataErrorInfo
{
    private readonly Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();

    public bool HasErrors => _errors.Any();

    public IEnumerable GetErrors(string propertyName)
    {
        if (_errors.ContainsKey(propertyName))
        {
            return _errors[propertyName];
        }

        return null;
    }

    private string _email;

    public string Email
    {
        get => _email;
        set
        {
            if (_email != value)
            {
                _email = value;
                ValidateEmail();
            }
        }
    }

    private void ValidateEmail()
    {
        ClearErrors(nameof(Email));

        if (string.IsNullOrEmpty(Email))
        {
            AddError(nameof(Email), "Email cannot be empty.");
        }

        // Simulate async email check
        if (Email == "existing@example.com")
        {
            AddError(nameof(Email), "Email is already registered.");
        }
    }

    private void AddError(string propertyName, string error)
    {
        if (!_errors.ContainsKey(propertyName))
        {
            _errors[propertyName] = new List<string>();
        }

        _errors[propertyName].Add(error);
        OnErrorsChanged(propertyName);
    }

    private void ClearErrors(string propertyName)
    {
        if (_errors.ContainsKey(propertyName))
        {
            _errors[propertyName].Clear();
            OnErrorsChanged(propertyName);
        }
    }

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    protected virtual void OnErrorsChanged(string propertyName)
    {
        ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
    }
}

এখানে, INotifyDataErrorInfo ইন্টারফেসটি Email প্রপার্টির জন্য ত্রুটি বার্তা প্রদান করে, এবং সেই ত্রুটির বার্তা View তে দেখানো হয়।

2. XAML (View) তে Error Notification

<!-- XAML File (View) -->
<TextBox Text="{Binding Email}" />
<TextBlock Text="{Binding Errors[Email]" Foreground="Red" />
<Button Content="Register" Command="{Binding RegisterCommand}" IsEnabled="{Binding IsEmailValid}" />

এখানে, TextBlock এর মাধ্যমে Email প্রপার্টির ত্রুটি বার্তা দেখানো হচ্ছে।


Async Validation এবং Error Notification এর সুবিধা

  • User Experience: ইউজারকে সঠিক সময়ে এবং সঠিকভাবে ত্রুটি বার্তা জানানো, ফলে অ্যাপ্লিকেশনটি আরও ইউজার-ফ্রেন্ডলি হয়ে ওঠে।
  • Non-blocking: Async Validation এর মাধ্যমে ভ্যালিডেশন লম্বা সময় নিলেও অ্যাপ্লিকেশন বা UI ব্লক হয় না।
  • Separation of Concerns: ViewModel এবং View এর মধ্যে পরিষ্কার বিভাজন বজায় থাকে, এবং UI কোডের তুলনায় ViewModel-এ অধিক কার্যকারিতা থাকে।

এভাবে Async Validation এবং Error Notification MVVM প্যাটার্নে ব্যবহারকারী ইন্টারঅ্যাকশন এবং অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করতে সাহায্য করে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion